Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / Sideband.git / files / sbapp / pydub / audio_segment.py

Displaying Raw • Download


sbapp/pydub/audio_segment.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 49.19 KB

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3division

Tff7b72import T7ee787array
Tff7b72import T7ee787os
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3TemporaryFileTb4b4b4, Te6edf3NamedTemporaryFile
Tff7b72import T7ee787wave
Tff7b72import T7ee787sys
Tff7b72import T7ee787struct
Tff7b72from T7ee787.T7ee787logging_utils Tff7b72import Te6edf3log_conversionTb4b4b4, Te6edf3log_subprocess_output
Tff7b72from T7ee787.T7ee787utils Tff7b72import Te6edf3mediainfo_jsonTb4b4b4, Te6edf3fsdecode
Tff7b72import T7ee787base64
Tff7b72from T7ee787collections Tff7b72import Te6edf3namedtuple

Tff7b72tryTb4b4b4:
Tff7b72from T7ee787StringIO Tff7b72import Te6edf3StringIO
Tff7b72exceptTb4b4b4:
Tff7b72from T7ee787io Tff7b72import Te6edf3StringIO

Tff7b72from T7ee787io Tff7b72import Te6edf3BytesIO

Tff7b72tryTb4b4b4:
Tff7b72from T7ee787itertools Tff7b72import Te6edf3izip
Tff7b72exceptTb4b4b4:
Te6edf3izip Tff7b72= Tffa657zip

Tff7b72from T7ee787.T7ee787utils Tff7b72import Tb4b4b4(
Te6edf3_fd_or_path_or_tempfileTb4b4b4,
Te6edf3db_to_floatTb4b4b4,
Te6edf3ratio_to_dbTb4b4b4,
Te6edf3get_encoder_nameTb4b4b4,
Te6edf3get_array_typeTb4b4b4,
Te6edf3audioopTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787.T7ee787exceptions Tff7b72import Tb4b4b4(
Te6edf3TooManyMissingFramesTb4b4b4,
Te6edf3InvalidDurationTb4b4b4,
Te6edf3InvalidID3TagVersionTb4b4b4,
Te6edf3InvalidTagTb4b4b4,
Te6edf3CouldntDecodeErrorTb4b4b4,
Te6edf3CouldntEncodeErrorTb4b4b4,
Te6edf3MissingAudioParameterTb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3sysTff7b72.Td2a8ffversion_info Tff7b72>Tff7b72= Tb4b4b4(T79c0ff3Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3basestring Tff7b72= Tffa657str
Te6edf3xrange Tff7b72= Tffa657range
Te6edf3StringIO Tff7b72= Te6edf3BytesIO


Tff7b72class T56d364ClassPropertyDescriptorTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fgetTb4b4b4, Te6edf3fsetTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffget Tff7b72= Te6edf3fget
Tff7b72selfTff7b72.Td2a8fffset Tff7b72= Te6edf3fset

Tff7b72def Tff7b72__get__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3objTb4b4b4, Te6edf3klassTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3klass Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3klass Tff7b72= Tffa657typeTb4b4b4(Te6edf3objTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8fffgetTff7b72.Td2a8ff__get__Tb4b4b4(Te6edf3objTb4b4b4, Te6edf3klassTb4b4b4)Tb4b4b4(Tb4b4b4)

Tff7b72def Tff7b72__set__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3objTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fffsetTb4b4b4:
Tff7b72raise Tf85149AttributeErrorTb4b4b4(Ta5d6ff"Ta5d6ffcanTa5d6ff'Ta5d6fft set attributeTa5d6ff"Tb4b4b4)
Te6edf3type_ Tff7b72= Tffa657typeTb4b4b4(Te6edf3objTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8fffsetTff7b72.Td2a8ff__get__Tb4b4b4(Te6edf3objTb4b4b4, Te6edf3type_Tb4b4b4)Tb4b4b4(Te6edf3valueTb4b4b4)

Tff7b72def Td2a8ffsetterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3funcTb4b4b4, Tb4b4b4(Tffa657classmethodTb4b4b4, Tffa657staticmethodTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3func Tff7b72= Tffa657classmethodTb4b4b4(Te6edf3funcTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffset Tff7b72= Te6edf3func
Tff7b72return Tff7b72self


Tff7b72def Td2a8ffclasspropertyTb4b4b4(Te6edf3funcTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3funcTb4b4b4, Tb4b4b4(Tffa657classmethodTb4b4b4, Tffa657staticmethodTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3func Tff7b72= Tffa657classmethodTb4b4b4(Te6edf3funcTb4b4b4)

Tff7b72return Te6edf3ClassPropertyDescriptorTb4b4b4(Te6edf3funcTb4b4b4)


Te6edf3AUDIO_FILE_EXT_ALIASES Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffm4aTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmp4Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffwaveTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwavTa5d6ff"Tb4b4b4,
Tb4b4b4}

Te6edf3WavSubChunk Tff7b72= Te6edf3namedtupleTb4b4b4(Ta5d6ff'Ta5d6ffWavSubChunkTa5d6ff'Tb4b4b4, Tb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffpositionTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffsizeTa5d6ff'Tb4b4b4]Tb4b4b4)
Te6edf3WavData Tff7b72= Te6edf3namedtupleTb4b4b4(Ta5d6ff'Ta5d6ffWavDataTa5d6ff'Tb4b4b4, Tb4b4b4[Ta5d6ff'Ta5d6ffaudio_formatTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffsample_rateTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffraw_dataTa5d6ff'Tb4b4b4]Tb4b4b4)


Tff7b72def Td2a8ffextract_wav_headersTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e# def search_subchunk(data, subchunk_id):
Te6edf3pos Tff7b72= T79c0ff12 T8b949e# The size of the RIFF chunk descriptor
Te6edf3subchunks Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Te6edf3pos Tff7b72+ T79c0ff8 Tff7b72<Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72and Tffa657lenTb4b4b4(Te6edf3subchunksTb4b4b4) Tff7b72< T79c0ff10Tb4b4b4:
Te6edf3subchunk_id Tff7b72= Te6edf3dataTb4b4b4[Te6edf3posTb4b4b4:Te6edf3pos Tff7b72+ T79c0ff4Tb4b4b4]
Te6edf3subchunk_size Tff7b72= Te6edf3structTff7b72.Td2a8ffunpack_fromTb4b4b4(Ta5d6ff'Ta5d6ff<ITa5d6ff'Tb4b4b4, Te6edf3dataTb4b4b4[Te6edf3pos Tff7b72+ T79c0ff4Tb4b4b4:Te6edf3pos Tff7b72+ T79c0ff8Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3subchunksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3WavSubChunkTb4b4b4(Te6edf3subchunk_idTb4b4b4, Te6edf3posTb4b4b4, Te6edf3subchunk_sizeTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3subchunk_id Tff7b72== Ta5d6ffbTa5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4:
T8b949e# 'data' is the last subchunk
Tff7b72break
Te6edf3pos Tff7b72+Tff7b72= Te6edf3subchunk_size Tff7b72+ T79c0ff8

Tff7b72return Te6edf3subchunks


Tff7b72def Td2a8ffread_wav_audioTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3headersTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3headersTb4b4b4:
Te6edf3headers Tff7b72= Te6edf3extract_wav_headersTb4b4b4(Te6edf3dataTb4b4b4)

Te6edf3fmt Tff7b72= Tb4b4b4[Te6edf3x Tff7b72for Te6edf3x Tff7b72in Te6edf3headers Tff7b72if Te6edf3xTff7b72.Td2a8ffid Tff7b72== Ta5d6ffbTa5d6ff'Ta5d6fffmt Ta5d6ff'Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3fmt Tff7b72or Te6edf3fmtTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffsize Tff7b72< T79c0ff16Tb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft find fmt header in wav dataTa5d6ff"Tb4b4b4)
Te6edf3fmt Tff7b72= Te6edf3fmtTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3pos Tff7b72= Te6edf3fmtTff7b72.Td2a8ffposition Tff7b72+ T79c0ff8
Te6edf3audio_format Tff7b72= Te6edf3structTff7b72.Td2a8ffunpack_fromTb4b4b4(Ta5d6ff'Ta5d6ff<HTa5d6ff'Tb4b4b4, Te6edf3dataTb4b4b4[Te6edf3posTb4b4b4:Te6edf3pos Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3audio_format Tff7b72!= T79c0ff1 Tff7b72and Te6edf3audio_format Tff7b72!= T79c0ff0xFFFETb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnknown audio format 0xTffd700%XTa5d6ff in wav dataTa5d6ff" Tff7b72%
Te6edf3audio_formatTb4b4b4)

Te6edf3channels Tff7b72= Te6edf3structTff7b72.Td2a8ffunpack_fromTb4b4b4(Ta5d6ff'Ta5d6ff<HTa5d6ff'Tb4b4b4, Te6edf3dataTb4b4b4[Te6edf3pos Tff7b72+ T79c0ff2Tb4b4b4:Te6edf3pos Tff7b72+ T79c0ff4Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3sample_rate Tff7b72= Te6edf3structTff7b72.Td2a8ffunpack_fromTb4b4b4(Ta5d6ff'Ta5d6ff<ITa5d6ff'Tb4b4b4, Te6edf3dataTb4b4b4[Te6edf3pos Tff7b72+ T79c0ff4Tb4b4b4:Te6edf3pos Tff7b72+ T79c0ff8Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3bits_per_sample Tff7b72= Te6edf3structTff7b72.Td2a8ffunpack_fromTb4b4b4(Ta5d6ff'Ta5d6ff<HTa5d6ff'Tb4b4b4, Te6edf3dataTb4b4b4[Te6edf3pos Tff7b72+ T79c0ff14Tb4b4b4:Te6edf3pos Tff7b72+ T79c0ff16Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]

Te6edf3data_hdr Tff7b72= Te6edf3headersTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3data_hdrTff7b72.Td2a8ffid Tff7b72!= Ta5d6ffbTa5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft find data header in wav dataTa5d6ff"Tb4b4b4)

Te6edf3pos Tff7b72= Te6edf3data_hdrTff7b72.Td2a8ffposition Tff7b72+ T79c0ff8
Tff7b72return Te6edf3WavDataTb4b4b4(Te6edf3audio_formatTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3sample_rateTb4b4b4, Te6edf3bits_per_sampleTb4b4b4,
Te6edf3dataTb4b4b4[Te6edf3posTb4b4b4:Te6edf3pos Tff7b72+ Te6edf3data_hdrTff7b72.Td2a8ffsizeTb4b4b4]Tb4b4b4)


Tff7b72def Td2a8fffix_wav_headersTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3headers Tff7b72= Te6edf3extract_wav_headersTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3headers Tff7b72or Te6edf3headersTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffid Tff7b72!= Ta5d6ffbTa5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4:
Tff7b72return

T8b949e# TODO: Handle huge files in some other way
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnable to process >4GB filesTa5d6ff"Tb4b4b4)

T8b949e# Set the file size in the RIFF chunk descriptor
Te6edf3dataTb4b4b4[T79c0ff4Tb4b4b4:T79c0ff8Tb4b4b4] Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff'Ta5d6ff<ITa5d6ff'Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72- T79c0ff8Tb4b4b4)

T8b949e# Set the data size in the data subchunk
Te6edf3pos Tff7b72= Te6edf3headersTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffposition
Te6edf3dataTb4b4b4[Te6edf3pos Tff7b72+ T79c0ff4Tb4b4b4:Te6edf3pos Tff7b72+ T79c0ff8Tb4b4b4] Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff'Ta5d6ff<ITa5d6ff'Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72- Te6edf3pos Tff7b72- T79c0ff8Tb4b4b4)


Tff7b72class T56d364AudioSegmentTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
T8b949e"""
AudioSegments are *immutable* objects representing segments of audio
that can be manipulated using python code.

AudioSegments are slicable using milliseconds.
for example:
a = AudioSegment.from_mp3(mp3file)
first_second = a[:1000] # get the first second of an mp3
slice = a[5000:10000] # get a slice from 5 to 10 seconds of an mp3
"""
Te6edf3converter Tff7b72= Te6edf3get_encoder_nameTb4b4b4(Tb4b4b4) T8b949e# either ffmpeg or avconv

T8b949e# TODO: remove in 1.0 release
T8b949e# maintain backwards compatibility for ffmpeg attr (now called converter)
Tf0883e@classproperty
Tff7b72def Td2a8ffffmpegTb4b4b4(Tff7b72clsTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8ffconverter

Tf0883e@ffmpegTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffffmpegTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Tff7b72clsTff7b72.Td2a8ffconverter Tff7b72= Te6edf3val

Te6edf3DEFAULT_CODECS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffoggTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflibvorbisTa5d6ff"
Tb4b4b4}

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTff7b72=Tff7b72NoneTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffsample_widthTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_rate Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffframe_rateTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)

Te6edf3audio_params Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)

Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3arrayTff7b72.Td2a8ffarrayTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8fftostringTb4b4b4(Tb4b4b4)

T8b949e# prevent partial specification of arguments
Tff7b72if Tffa657anyTb4b4b4(Te6edf3audio_paramsTb4b4b4) Tff7b72and Tff7b72None Tff7b72in Te6edf3audio_paramsTb4b4b4:
Tff7b72raise Te6edf3MissingAudioParameterTb4b4b4(Ta5d6ff"Ta5d6ffEither all audio parameters or no parameter must be specifiedTa5d6ff"Tb4b4b4)

T8b949e# all arguments are given
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4) Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffdata length must be a multiple of Ta5d6ff'Ta5d6ff(sample_width * channels)Ta5d6ff'Ta5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72* Tff7b72selfTff7b72.Td2a8ffsample_width
Tff7b72selfTff7b72.Td2a8ff_data Tff7b72= Te6edf3data

T8b949e# keep support for 'metadata' until audio params are used everywhere
Tff7b72elif Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffmetadataTa5d6ff'Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
T8b949e# internal use only
Tff7b72selfTff7b72.Td2a8ff_data Tff7b72= Te6edf3data
Tff7b72for Te6edf3attrTb4b4b4, Te6edf3val Tff7b72in Te6edf3kwargsTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff'Ta5d6ffmetadataTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657setattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3attrTb4b4b4, Te6edf3valTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# normal construction
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3data Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tb4b4b4(Te6edf3basestringTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4) Tff7b72else Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3d Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'
Te6edf3reader Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2 Tff7b72*Tff7b72* T79c0ff31 Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72while Te6edf3readerTb4b4b4:
Te6edf3d Tff7b72+Tff7b72= Te6edf3reader
Te6edf3reader Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2 Tff7b72*Tff7b72* T79c0ff31 Tff7b72- T79c0ff1Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3d

Te6edf3wav_data Tff7b72= Te6edf3read_wav_audioTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3wav_dataTb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft read wav audio from dataTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3wav_dataTff7b72.Td2a8ffchannels
Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72= Te6edf3wav_dataTff7b72.Td2a8ffbits_per_sample Tff7b72/Tff7b72/ T79c0ff8
Tff7b72selfTff7b72.Td2a8ffframe_rate Tff7b72= Te6edf3wav_dataTff7b72.Td2a8ffsample_rate
Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72* Tff7b72selfTff7b72.Td2a8ffsample_width
Tff7b72selfTff7b72.Td2a8ff_data Tff7b72= Te6edf3wav_dataTff7b72.Td2a8ffraw_data
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# convert from unsigned integers in wav
Tff7b72selfTff7b72.Td2a8ff_data Tff7b72= Te6edf3audioopTff7b72.Td2a8ffbiasTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff128Tb4b4b4)

T8b949e# Convert 24-bit audio to 32-bit audio.
T8b949e# (stdlib audioop and array modules do not support 24-bit data)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72== T79c0ff3Tb4b4b4:
Te6edf3byte_buffer Tff7b72= Te6edf3BytesIOTb4b4b4(Tb4b4b4)

T8b949e# Workaround for python 2 vs python 3. _data in 2.x are length-1 strings,
T8b949e# And in 3.x are ints.
Te6edf3pack_fmt Tff7b72= Ta5d6ff'Ta5d6ffBBBTa5d6ff' Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Tffa657intTb4b4b4) Tff7b72else Ta5d6ff'Ta5d6ffcccTa5d6ff'

T8b949e# This conversion maintains the 24 bit values. The values are
T8b949e# not scaled up to the 32 bit range. Other conversions could be
T8b949e# implemented.
Te6edf3i Tff7b72= Tffa657iterTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4)
Te6edf3padding Tff7b72= Tb4b4b4{Tff7b72FalseTb4b4b4: Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'Tb4b4b4, Tff7b72TrueTb4b4b4: Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff'Tb4b4b4}
Tff7b72for Te6edf3b0Tb4b4b4, Te6edf3b1Tb4b4b4, Te6edf3b2 Tff7b72in Te6edf3izipTb4b4b4(Te6edf3iTb4b4b4, Te6edf3iTb4b4b4, Te6edf3iTb4b4b4)Tb4b4b4:
Te6edf3byte_bufferTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3paddingTb4b4b4[Te6edf3b2 Tff7b72> Ta5d6ffbTa5d6ff'Tffea00\x7fTa5d6ff'Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4]Tb4b4b4)
Te6edf3old_bytes Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3pack_fmtTb4b4b4, Te6edf3b0Tb4b4b4, Te6edf3b1Tb4b4b4, Te6edf3b2Tb4b4b4)
Te6edf3byte_bufferTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3old_bytesTb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_data Tff7b72= Te6edf3byte_bufferTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72= T79c0ff4
Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72* Tff7b72selfTff7b72.Td2a8ffsample_width

Tffa657superTb4b4b4(Te6edf3AudioSegmentTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffraw_dataTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
public access to the raw audio data as a bytestring
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_data

Tff7b72def Td2a8ffget_array_of_samplesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3array_type_overrideTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
returns the raw_data as an array of samples
"""
Tff7b72if Te6edf3array_type_override Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3array_type_override Tff7b72= Tff7b72selfTff7b72.Td2a8ffarray_type
Tff7b72return Te6edf3arrayTff7b72.Td2a8ffarrayTb4b4b4(Te6edf3array_type_overrideTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffarray_typeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3get_array_typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72* T79c0ff8Tb4b4b4)

Tff7b72def Tff7b72__len__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
returns the length of this audio segment in milliseconds
"""
Tff7b72return Tffa657roundTb4b4b4(T79c0ff1000 Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4)Tb4b4b4)

Tff7b72def Tff7b72__eq__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_data Tff7b72== Te6edf3otherTff7b72.Td2a8ff_data
Tff7b72exceptTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Tff7b72__hash__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657hashTb4b4b4(Te6edf3AudioSegmentTb4b4b4) Tff7b72^ Tffa657hashTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4)Tb4b4b4)

Tff7b72def Tff7b72__ne__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72not Tb4b4b4(Tff7b72self Tff7b72== Te6edf3otherTb4b4b4)

Tff7b72def Tff7b72__iter__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4(Tff7b72selfTb4b4b4[Te6edf3iTb4b4b4] Tff7b72for Te6edf3i Tff7b72in Te6edf3xrangeTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)Tb4b4b4)

Tff7b72def Tff7b72__getitem__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3millisecondTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3millisecondTb4b4b4, Tffa657sliceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3millisecondTff7b72.Td2a8ffstepTb4b4b4:
Tff7b72return Tb4b4b4(
Tff7b72selfTb4b4b4[Te6edf3iTb4b4b4:Te6edf3i Tff7b72+ Te6edf3millisecondTff7b72.Td2a8ffstepTb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Te6edf3xrangeTb4b4b4(Tff7b72*Te6edf3millisecondTff7b72.Td2a8ffindicesTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4)

Te6edf3start Tff7b72= Te6edf3millisecondTff7b72.Td2a8ffstart Tff7b72if Te6edf3millisecondTff7b72.Td2a8ffstart Tff7b72is Tff7b72not Tff7b72None Tff7b72else T79c0ff0
Te6edf3end Tff7b72= Te6edf3millisecondTff7b72.Td2a8ffstop Tff7b72if Te6edf3millisecondTff7b72.Td2a8ffstop Tff7b72is Tff7b72not Tff7b72None \
Tff7b72else Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)

Te6edf3start Tff7b72= Tffa657minTb4b4b4(Te6edf3startTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)
Te6edf3end Tff7b72= Tffa657minTb4b4b4(Te6edf3endTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3start Tff7b72= Te6edf3millisecond
Te6edf3end Tff7b72= Te6edf3millisecond Tff7b72+ T79c0ff1

Te6edf3start Tff7b72= Tff7b72selfTff7b72.Td2a8ff_parse_positionTb4b4b4(Te6edf3startTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffframe_width
Te6edf3end Tff7b72= Tff7b72selfTff7b72.Td2a8ff_parse_positionTb4b4b4(Te6edf3endTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffframe_width
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4[Te6edf3startTb4b4b4:Te6edf3endTb4b4b4]

T8b949e# ensure the output is as long as the requester is expecting
Te6edf3expected_length Tff7b72= Te6edf3end Tff7b72- Te6edf3start
Te6edf3missing_frames Tff7b72= Tb4b4b4(Te6edf3expected_length Tff7b72- Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4) Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffframe_width
Tff7b72if Te6edf3missing_framesTb4b4b4:
Tff7b72if Te6edf3missing_frames Tff7b72> Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Te6edf3msTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3TooManyMissingFramesTb4b4b4(
Ta5d6ff"Ta5d6ffYou should never be filling in Ta5d6ff"
Ta5d6ff"Ta5d6ff more than 2 ms with silence here, Ta5d6ff"
Ta5d6ff"Ta5d6ffmissing frames: Tffd700%sTa5d6ff" Tff7b72% Te6edf3missing_framesTb4b4b4)
Te6edf3silence Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3dataTb4b4b4[Tb4b4b4:Tff7b72selfTff7b72.Td2a8ffframe_widthTb4b4b4]Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3data Tff7b72+Tff7b72= Tb4b4b4(Te6edf3silence Tff7b72* Te6edf3missing_framesTb4b4b4)

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Td2a8ffget_sample_sliceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3start_sampleTff7b72=Tff7b72NoneTb4b4b4, Te6edf3end_sampleTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Get a section of the audio segment by sample index.

NOTE: Negative indices do *not* address samples backword
from the end of the audio segment like a python list.
This is intentional.
"""
Te6edf3max_val Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffboundedTb4b4b4(Te6edf3valTb4b4b4, Te6edf3defaultTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3val Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3default
Tff7b72if Te6edf3val Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72return T79c0ff0
Tff7b72if Te6edf3val Tff7b72> Te6edf3max_valTb4b4b4:
Tff7b72return Te6edf3max_val
Tff7b72return Te6edf3val

Te6edf3start_i Tff7b72= Te6edf3boundedTb4b4b4(Te6edf3start_sampleTb4b4b4, T79c0ff0Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffframe_width
Te6edf3end_i Tff7b72= Te6edf3boundedTb4b4b4(Te6edf3end_sampleTb4b4b4, Te6edf3max_valTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffframe_width

Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4[Te6edf3start_iTb4b4b4:Te6edf3end_iTb4b4b4]
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Tff7b72__add__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3argTb4b4b4, Te6edf3AudioSegmentTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffappendTb4b4b4(Te6edf3argTb4b4b4, Te6edf3crossfadeTff7b72=T79c0ff0Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffapply_gainTb4b4b4(Te6edf3argTb4b4b4)

Tff7b72def Tff7b72__radd__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3rargTb4b4b4)Tb4b4b4:
T8b949e"""
Permit use of sum() builtin with an iterable of AudioSegments
"""
Tff7b72if Te6edf3rarg Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72self
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffGains must be the second addend after the Ta5d6ff"
Ta5d6ff"Ta5d6ffAudioSegmentTa5d6ff"Tb4b4b4)

Tff7b72def Tff7b72__sub__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3argTb4b4b4, Te6edf3AudioSegmentTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffAudioSegment objects canTa5d6ff'Ta5d6fft be subtracted from Ta5d6ff"
Ta5d6ff"Ta5d6ffeach otherTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffapply_gainTb4b4b4(Tff7b72-Te6edf3argTb4b4b4)

Tff7b72def Tff7b72__mul__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argTb4b4b4)Tb4b4b4:
T8b949e"""
If the argument is an AudioSegment, overlay the multiplied audio
segment.

If it's a number, just use the string multiply operation to repeat the
audio.

The following would return an AudioSegment that contains the
audio of audio_seg eight times

`audio_seg * 8`
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3argTb4b4b4, Te6edf3AudioSegmentTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoverlayTb4b4b4(Te6edf3argTb4b4b4, Te6edf3positionTff7b72=T79c0ff0Tb4b4b4, Te6edf3loopTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Tff7b72selfTff7b72.Td2a8ff_data Tff7b72* Te6edf3argTb4b4b4)

Tff7b72def Td2a8ff_spawnTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3overridesTff7b72=Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4:
T8b949e"""
Creates a new audio segment using the metadata from the current one
and the data passed in. Should be used whenever an AudioSegment is
being returned by an operation that would alters the current one,
since AudioSegment objects are immutable.
"""
T8b949e# accept lists of data chunks
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3arrayTff7b72.Td2a8ffarrayTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8fftostringTb4b4b4(Tb4b4b4)

T8b949e# accept file-like objects
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff'Ta5d6ffreadTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff'Ta5d6ffseekTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3dataTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)

Te6edf3metadata Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4,
Ta5d6ff'Ta5d6ffframe_widthTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffframe_widthTb4b4b4,
Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffchannels
Tb4b4b4}
Te6edf3metadataTff7b72.Td2a8ffupdateTb4b4b4(Te6edf3overridesTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__class__Tb4b4b4(Te6edf3dataTff7b72=Te6edf3dataTb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8ff_syncTb4b4b4(Tff7b72clsTb4b4b4, Tff7b72*Te6edf3segsTb4b4b4)Tb4b4b4:
Te6edf3channels Tff7b72= Tffa657maxTb4b4b4(Te6edf3segTff7b72.Td2a8ffchannels Tff7b72for Te6edf3seg Tff7b72in Te6edf3segsTb4b4b4)
Te6edf3frame_rate Tff7b72= Tffa657maxTb4b4b4(Te6edf3segTff7b72.Td2a8ffframe_rate Tff7b72for Te6edf3seg Tff7b72in Te6edf3segsTb4b4b4)
Te6edf3sample_width Tff7b72= Tffa657maxTb4b4b4(Te6edf3segTff7b72.Td2a8ffsample_width Tff7b72for Te6edf3seg Tff7b72in Te6edf3segsTb4b4b4)

Tff7b72return Tffa657tupleTb4b4b4(
Te6edf3segTff7b72.Td2a8ffset_channelsTb4b4b4(Te6edf3channelsTb4b4b4)Tff7b72.Td2a8ffset_frame_rateTb4b4b4(Te6edf3frame_rateTb4b4b4)Tff7b72.Td2a8ffset_sample_widthTb4b4b4(Te6edf3sample_widthTb4b4b4)
Tff7b72for Te6edf3seg Tff7b72in Te6edf3segs
Tb4b4b4)

Tff7b72def Td2a8ff_parse_positionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3val Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3val Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72- Tffa657absTb4b4b4(Te6edf3valTb4b4b4)
Te6edf3val Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Te6edf3msTff7b72=Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4) Tff7b72if Te6edf3val Tff7b72== Tffa657floatTb4b4b4(Ta5d6ff"Ta5d6ffinfTa5d6ff"Tb4b4b4) Tff7b72else \
Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Te6edf3msTff7b72=Te6edf3valTb4b4b4)
Tff7b72return Tffa657intTb4b4b4(Te6edf3valTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8ffemptyTb4b4b4(Tff7b72clsTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTb4b4b4(Ta5d6ffbTa5d6ff'Ta5d6ff'Tb4b4b4, Te6edf3metadataTff7b72=Tb4b4b4{
Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffsample_widthTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffframe_rateTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffframe_widthTa5d6ff"Tb4b4b4: T79c0ff1
Tb4b4b4}Tb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8ffsilentTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3durationTff7b72=T79c0ff1000Tb4b4b4, Te6edf3frame_rateTff7b72=T79c0ff11025Tb4b4b4)Tb4b4b4:
T8b949e"""
Generate a silent audio segment.
duration specified in milliseconds (default duration: 1000ms, default frame_rate: 11025).
"""
Te6edf3frames Tff7b72= Tffa657intTb4b4b4(Te6edf3frame_rate Tff7b72* Tb4b4b4(Te6edf3duration Tff7b72/ T79c0ff1000.0Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\0Tffea00\0Ta5d6ff" Tff7b72* Te6edf3frames
Tff7b72return Tff7b72clsTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3metadataTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffsample_widthTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4,
Ta5d6ff"Ta5d6ffframe_rateTa5d6ff"Tb4b4b4: Te6edf3frame_rateTb4b4b4,
Ta5d6ff"Ta5d6ffframe_widthTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4}Tb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_mono_audiosegmentsTb4b4b4(Tff7b72clsTb4b4b4, Tff7b72*Te6edf3mono_segmentsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3mono_segmentsTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAt least one AudioSegment instance is requiredTa5d6ff"Tb4b4b4)

Te6edf3segs Tff7b72= Tff7b72clsTff7b72.Td2a8ff_syncTb4b4b4(Tff7b72*Te6edf3mono_segmentsTb4b4b4)

Tff7b72if Te6edf3segsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffchannels Tff7b72!= T79c0ff1Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffAudioSegment.from_mono_audiosegments requires all arguments are mono AudioSegment instancesTa5d6ff"Tb4b4b4)

Te6edf3channels Tff7b72= Tffa657lenTb4b4b4(Te6edf3segsTb4b4b4)
Te6edf3sample_width Tff7b72= Te6edf3segsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffsample_width
Te6edf3frame_rate Tff7b72= Te6edf3segsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffframe_rate

Te6edf3frame_count Tff7b72= Tffa657maxTb4b4b4(Tffa657intTb4b4b4(Te6edf3segTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72for Te6edf3seg Tff7b72in Te6edf3segsTb4b4b4)
Te6edf3data Tff7b72= Te6edf3arrayTff7b72.Td2a8ffarrayTb4b4b4(
Te6edf3segsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffarray_typeTb4b4b4,
Ta5d6ffbTa5d6ff'Tffea00\0Ta5d6ff' Tff7b72* Tb4b4b4(Te6edf3frame_count Tff7b72* Te6edf3sample_width Tff7b72* Te6edf3channelsTb4b4b4)
Tb4b4b4)

Tff7b72for Te6edf3iTb4b4b4, Te6edf3seg Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3segsTb4b4b4)Tb4b4b4:
Te6edf3dataTb4b4b4[Te6edf3iTb4b4b4:Tb4b4b4:Te6edf3channelsTb4b4b4] Tff7b72= Te6edf3segTff7b72.Td2a8ffget_array_of_samplesTb4b4b4(Tb4b4b4)

Tff7b72return Tff7b72clsTb4b4b4(
Te6edf3dataTb4b4b4,
Te6edf3channelsTff7b72=Te6edf3channelsTb4b4b4,
Te6edf3sample_widthTff7b72=Te6edf3sample_widthTb4b4b4,
Te6edf3frame_rateTff7b72=Te6edf3frame_rateTb4b4b4,
Tb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_file_using_temporary_filesTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Tffa657formatTff7b72=Tff7b72NoneTb4b4b4, Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4, Te6edf3start_secondTff7b72=Tff7b72NoneTb4b4b4, Te6edf3durationTff7b72=Tff7b72NoneTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3orig_file Tff7b72= Te6edf3file
Te6edf3fileTb4b4b4, Te6edf3close_file Tff7b72= Te6edf3_fd_or_path_or_tempfileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4, Te6edf3tempfileTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Tffa657formatTb4b4b4:
Tffa657format Tff7b72= Tffa657formatTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tffa657format Tff7b72= Te6edf3AUDIO_FILE_EXT_ALIASESTff7b72.Td2a8ffgetTb4b4b4(Tffa657formatTb4b4b4, Tffa657formatTb4b4b4)

Tff7b72def Td2a8ffis_formatTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4:
Te6edf3f Tff7b72= Te6edf3fTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657format Tff7b72== Te6edf3fTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3orig_fileTb4b4b4, Te6edf3basestringTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3orig_fileTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.Tffd700{0}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3orig_fileTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3orig_fileTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff.Tffd700{0}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf8Ta5d6ff'Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72False

Tff7b72if Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffwavTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3obj Tff7b72= Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3fileTb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3obj
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Tb4b4b4:Te6edf3durationTff7b72*T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4(Te6edf3start_secondTff7b72+Te6edf3durationTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4]
Tff7b72exceptTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffpcmTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3sample_width Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4]
Te6edf3frame_rate Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4]
Te6edf3channels Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4]
Te6edf3metadata Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4: Te6edf3sample_widthTb4b4b4,
Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4: Te6edf3frame_rateTb4b4b4,
Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4: Te6edf3channelsTb4b4b4,
Ta5d6ff'Ta5d6ffframe_widthTa5d6ff'Tb4b4b4: Te6edf3channels Tff7b72* Te6edf3sample_width
Tb4b4b4}
Te6edf3obj Tff7b72= Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3obj
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Te6edf3start_second Tff7b72* T79c0ff1000Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Tb4b4b4:Te6edf3duration Tff7b72* T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Te6edf3start_second Tff7b72* T79c0ff1000Tb4b4b4:Tb4b4b4(Te6edf3start_second Tff7b72+ Te6edf3durationTb4b4b4) Tff7b72* T79c0ff1000Tb4b4b4]

Te6edf3input_file Tff7b72= Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff'Ta5d6ffwbTa5d6ff'Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3input_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72exceptTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3input_fileTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3input_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3input_file Tff7b72= Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff'Ta5d6ffwbTa5d6ff'Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4, Te6edf3bufferingTff7b72=T79c0ff2 Tff7b72*Tff7b72* T79c0ff31 Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3close_file Tff7b72= Tff7b72True
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3orig_fileTb4b4b4, Te6edf3bufferingTff7b72=T79c0ff2 Tff7b72*Tff7b72* T79c0ff13 Tff7b72- T79c0ff1Tb4b4b4, Te6edf3modeTff7b72=Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4)
Te6edf3reader Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2 Tff7b72*Tff7b72* T79c0ff31 Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72while Te6edf3readerTb4b4b4:
Te6edf3input_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3readerTb4b4b4)
Te6edf3reader Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2 Tff7b72*Tff7b72* T79c0ff31 Tff7b72- T79c0ff1Tb4b4b4)
Te6edf3input_fileTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3output Tff7b72= Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4)

Te6edf3conversion_command Tff7b72= Tb4b4b4[Tff7b72clsTff7b72.Td2a8ffconverterTb4b4b4,
Ta5d6ff'Ta5d6ff-yTa5d6ff'Tb4b4b4, T8b949e# always overwrite existing files
Tb4b4b4]

T8b949e# If format is not defined
T8b949e# ffmpeg/avconv will detect it automatically
Tff7b72if Tffa657formatTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Tffa657formatTb4b4b4]

Tff7b72if Te6edf3codecTb4b4b4:
T8b949e# force audio decoder
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-acodecTa5d6ff"Tb4b4b4, Te6edf3codecTb4b4b4]

Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Te6edf3input_fileTff7b72.Td2a8ffnameTb4b4b4, T8b949e# input_file options (filename last)
Ta5d6ff"Ta5d6ff-vnTa5d6ff"Tb4b4b4, T8b949e# Drop any video streams if there are any
Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwavTa5d6ff" T8b949e# output options (filename last)
Tb4b4b4]

Tff7b72if Te6edf3start_second Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-ssTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3start_secondTb4b4b4)Tb4b4b4]

Tff7b72if Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3durationTb4b4b4)Tb4b4b4]

Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Te6edf3outputTff7b72.Td2a8ffnameTb4b4b4]

Tff7b72if Te6edf3parameters Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
T8b949e# extend arguments with arbitrary set
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Te6edf3parametersTb4b4b4)

Te6edf3log_conversionTb4b4b4(Te6edf3conversion_commandTb4b4b4)

Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffdevnullTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3devnullTb4b4b4:
Te6edf3p Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(Te6edf3conversion_commandTb4b4b4, Te6edf3stdinTff7b72=Te6edf3devnullTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3p_outTb4b4b4, Te6edf3p_err Tff7b72= Te6edf3pTff7b72.Td2a8ffcommunicateTb4b4b4(Tb4b4b4)

Te6edf3log_subprocess_outputTb4b4b4(Te6edf3p_outTb4b4b4)
Te6edf3log_subprocess_outputTb4b4b4(Te6edf3p_errTb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3pTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(
Ta5d6ff"Ta5d6ffDecoding failed. ffmpeg returned error code: Tffd700{0}Tffea00\nTffea00\nTa5d6ffOutput from ffmpeg/avlib:Tffea00\nTffea00\nTffd700{1}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3pTff7b72.Td2a8ffreturncodeTb4b4b4, Te6edf3p_errTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4) Tb4b4b4)Tb4b4b4)
Te6edf3obj Tff7b72= Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3outputTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3input_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3input_fileTff7b72.Td2a8ffnameTb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3outputTff7b72.Td2a8ffnameTb4b4b4)

Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3obj
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[T79c0ff0Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Tb4b4b4:Te6edf3duration Tff7b72* T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[T79c0ff0Tb4b4b4:Te6edf3duration Tff7b72* T79c0ff1000Tb4b4b4]


Tf0883e@classmethod
Tff7b72def Td2a8fffrom_fileTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Tffa657formatTff7b72=Tff7b72NoneTb4b4b4, Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4, Te6edf3start_secondTff7b72=Tff7b72NoneTb4b4b4, Te6edf3durationTff7b72=Tff7b72NoneTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3orig_file Tff7b72= Te6edf3file
Tff7b72tryTb4b4b4:
Te6edf3filename Tff7b72= Te6edf3fsdecodeTb4b4b4(Te6edf3fileTb4b4b4)
Tff7b72except Tf85149TypeErrorTb4b4b4:
Te6edf3filename Tff7b72= Tff7b72None
Te6edf3fileTb4b4b4, Te6edf3close_file Tff7b72= Te6edf3_fd_or_path_or_tempfileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4, Te6edf3tempfileTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Tffa657formatTb4b4b4:
Tffa657format Tff7b72= Tffa657formatTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tffa657format Tff7b72= Te6edf3AUDIO_FILE_EXT_ALIASESTff7b72.Td2a8ffgetTb4b4b4(Tffa657formatTb4b4b4, Tffa657formatTb4b4b4)

Tff7b72def Td2a8ffis_formatTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4:
Te6edf3f Tff7b72= Te6edf3fTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657format Tff7b72== Te6edf3fTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72if Te6edf3filenameTb4b4b4:
Tff7b72return Te6edf3filenameTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.Tffd700{0}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4)

Tff7b72return Tff7b72False

Tff7b72if Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffwavTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3fileTb4b4b4)
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3durationTff7b72*T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8ff_from_safe_wavTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4(Te6edf3start_secondTff7b72+Te6edf3durationTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4]
Tff7b72exceptTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3is_formatTb4b4b4(Ta5d6ff"Ta5d6ffpcmTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3sample_width Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4]
Te6edf3frame_rate Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4]
Te6edf3channels Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4]
Te6edf3metadata Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4: Te6edf3sample_widthTb4b4b4,
Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4: Te6edf3frame_rateTb4b4b4,
Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4: Te6edf3channelsTb4b4b4,
Ta5d6ff'Ta5d6ffframe_widthTa5d6ff'Tb4b4b4: Te6edf3channels Tff7b72* Te6edf3sample_width
Tb4b4b4}
Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)Tb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3durationTff7b72*T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4)Tb4b4b4[Te6edf3start_secondTff7b72*T79c0ff1000Tb4b4b4:Tb4b4b4(Te6edf3start_secondTff7b72+Te6edf3durationTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4]

Te6edf3conversion_command Tff7b72= Tb4b4b4[Tff7b72clsTff7b72.Td2a8ffconverterTb4b4b4,
Ta5d6ff'Ta5d6ff-yTa5d6ff'Tb4b4b4, T8b949e# always overwrite existing files
Tb4b4b4]

T8b949e# If format is not defined
T8b949e# ffmpeg/avconv will detect it automatically
Tff7b72if Tffa657formatTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Tffa657formatTb4b4b4]

Tff7b72if Te6edf3codecTb4b4b4:
T8b949e# force audio decoder
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-acodecTa5d6ff"Tb4b4b4, Te6edf3codecTb4b4b4]

Te6edf3read_ahead_limit Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffread_ahead_limitTa5d6ff'Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3filenameTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Te6edf3filenameTb4b4b4]
Te6edf3stdin_parameter Tff7b72= Tff7b72None
Te6edf3stdin_data Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72clsTff7b72.Td2a8ffconverter Tff7b72== Ta5d6ff'Ta5d6ffffmpegTa5d6ff'Tb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-read_ahead_limitTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3read_ahead_limitTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcache:pipe:0Ta5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4]
Te6edf3stdin_parameter Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPIPE
Te6edf3stdin_data Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3codecTb4b4b4:
Te6edf3info Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3info Tff7b72= Te6edf3mediainfo_jsonTb4b4b4(Te6edf3orig_fileTb4b4b4, Te6edf3read_ahead_limitTff7b72=Te6edf3read_ahead_limitTb4b4b4)
Tff7b72if Te6edf3infoTb4b4b4:
Te6edf3audio_streams Tff7b72= Tb4b4b4[Te6edf3x Tff7b72for Te6edf3x Tff7b72in Te6edf3infoTb4b4b4[Ta5d6ff'Ta5d6ffstreamsTa5d6ff'Tb4b4b4]
Tff7b72if Te6edf3xTb4b4b4[Ta5d6ff'Ta5d6ffcodec_typeTa5d6ff'Tb4b4b4] Tff7b72== Ta5d6ff'Ta5d6ffaudioTa5d6ff'Tb4b4b4]
T8b949e# This is a workaround for some ffprobe versions that always say
T8b949e# that mp3/mp4/aac/webm/ogg files contain fltp samples
Te6edf3audio_codec Tff7b72= Te6edf3audio_streamsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffcodec_nameTa5d6ff'Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3audio_streamsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffsample_fmtTa5d6ff'Tb4b4b4) Tff7b72== Ta5d6ff'Ta5d6fffltpTa5d6ff' Tff7b72and
Te6edf3audio_codec Tff7b72in Tb4b4b4[Ta5d6ff'Ta5d6ffmp3Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffmp4Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffaacTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffwebmTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffoggTa5d6ff'Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3bits_per_sample Tff7b72= T79c0ff16
Tff7b72elseTb4b4b4:
Te6edf3bits_per_sample Tff7b72= Te6edf3audio_streamsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4]
Tff7b72if Te6edf3bits_per_sample Tff7b72== T79c0ff8Tb4b4b4:
Te6edf3acodec Tff7b72= Ta5d6ff'Ta5d6ffpcm_u8Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3acodec Tff7b72= Ta5d6ff'Ta5d6ffpcm_sTffd700%dTa5d6ffleTa5d6ff' Tff7b72% Te6edf3bits_per_sample

Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-acodecTa5d6ff"Tb4b4b4, Te6edf3acodecTb4b4b4]

Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ff-vnTa5d6ff"Tb4b4b4, T8b949e# Drop any video streams if there are any
Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwavTa5d6ff" T8b949e# output options (filename last)
Tb4b4b4]

Tff7b72if Te6edf3start_second Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-ssTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3start_secondTb4b4b4)Tb4b4b4]

Tff7b72if Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3durationTb4b4b4)Tb4b4b4]

Te6edf3conversion_command Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4]

Tff7b72if Te6edf3parameters Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
T8b949e# extend arguments with arbitrary set
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Te6edf3parametersTb4b4b4)

Te6edf3log_conversionTb4b4b4(Te6edf3conversion_commandTb4b4b4)

Te6edf3p Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(Te6edf3conversion_commandTb4b4b4, Te6edf3stdinTff7b72=Te6edf3stdin_parameterTb4b4b4,
Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3p_outTb4b4b4, Te6edf3p_err Tff7b72= Te6edf3pTff7b72.Td2a8ffcommunicateTb4b4b4(Tffa657inputTff7b72=Te6edf3stdin_dataTb4b4b4)

Tff7b72if Te6edf3pTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0 Tff7b72or Tffa657lenTb4b4b4(Te6edf3p_outTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72raise Te6edf3CouldntDecodeErrorTb4b4b4(
Ta5d6ff"Ta5d6ffDecoding failed. ffmpeg returned error code: Tffd700{0}Tffea00\nTffea00\nTa5d6ffOutput from ffmpeg/avlib:Tffea00\nTffea00\nTffd700{1}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3pTff7b72.Td2a8ffreturncodeTb4b4b4, Te6edf3p_errTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4) Tb4b4b4)Tb4b4b4)

Te6edf3p_out Tff7b72= Tffa657bytearrayTb4b4b4(Te6edf3p_outTb4b4b4)
Te6edf3fix_wav_headersTb4b4b4(Te6edf3p_outTb4b4b4)
Te6edf3p_out Tff7b72= Tffa657bytesTb4b4b4(Te6edf3p_outTb4b4b4)
Te6edf3obj Tff7b72= Tff7b72clsTb4b4b4(Te6edf3p_outTb4b4b4)

Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3obj
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[T79c0ff0Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3start_second Tff7b72is Tff7b72None Tff7b72and Te6edf3duration Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[Tb4b4b4:Te6edf3duration Tff7b72* T79c0ff1000Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3objTb4b4b4[T79c0ff0Tb4b4b4:Te6edf3duration Tff7b72* T79c0ff1000Tb4b4b4]

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_mp3Tb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffmp3Ta5d6ff'Tb4b4b4, Te6edf3parametersTff7b72=Te6edf3parametersTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_flvTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffflvTa5d6ff'Tb4b4b4, Te6edf3parametersTff7b72=Te6edf3parametersTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_oggTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffoggTa5d6ff'Tb4b4b4, Te6edf3parametersTff7b72=Te6edf3parametersTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_wavTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffwavTa5d6ff'Tb4b4b4, Te6edf3parametersTff7b72=Te6edf3parametersTb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8fffrom_rawTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffrawTa5d6ff'Tb4b4b4, Te6edf3sample_widthTff7b72=Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4]Tb4b4b4, Te6edf3frame_rateTff7b72=Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4]Tb4b4b4,
Te6edf3channelsTff7b72=Te6edf3kwargsTb4b4b4[Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4]Tb4b4b4)

Tf0883e@classmethod
Tff7b72def Td2a8ff_from_safe_wavTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4:
Te6edf3fileTb4b4b4, Te6edf3close_file Tff7b72= Te6edf3_fd_or_path_or_tempfileTb4b4b4(Te6edf3fileTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4, Te6edf3tempfileTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3obj Tff7b72= Tff7b72clsTb4b4b4(Te6edf3dataTff7b72=Te6edf3fileTb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3obj

Tff7b72def Td2a8ffexportTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3out_fTff7b72=Tff7b72NoneTb4b4b4, Tffa657formatTff7b72=Ta5d6ff'Ta5d6ffmp3Ta5d6ff'Tb4b4b4, Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4, Te6edf3bitrateTff7b72=Tff7b72NoneTb4b4b4, Te6edf3parametersTff7b72=Tff7b72NoneTb4b4b4, Te6edf3tagsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3id3v2_versionTff7b72=Ta5d6ff'Ta5d6ff4Ta5d6ff'Tb4b4b4,
Te6edf3coverTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Export an AudioSegment to a file with given options

out_f (string):
Path to destination audio file. Also accepts os.PathLike objects on
python >= 3.6

format (string)
Format for destination audio file.
('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files)

codec (string)
Codec used to encode the destination file.

bitrate (string)
Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...)
Each codec accepts different bitrate arguments so take a look at the
ffmpeg documentation for details (bitrate usually shown as -b, -ba or
-a:b).

parameters (list of strings)
Aditional ffmpeg/avconv parameters

tags (dict)
Set metadata information to destination files
usually used as tags. ({title='Song Title', artist='Song Artist'})

id3v2_version (string)
Set ID3v2 version for tags. (default: '4')

cover (file)
Set cover for audio file from image file. (png or jpg)
"""
Te6edf3id3v2_allowed_versions Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff3Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff4Ta5d6ff'Tb4b4b4]

Tff7b72if Tffa657format Tff7b72== Ta5d6ff"Ta5d6ffrawTa5d6ff" Tff7b72and Tb4b4b4(Te6edf3codec Tff7b72is Tff7b72not Tff7b72None Tff7b72or Te6edf3parameters Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149AttributeErrorTb4b4b4(
Ta5d6ff'Ta5d6ffCan not invoke ffmpeg when export format is Ta5d6ff"Ta5d6ffrawTa5d6ff"Ta5d6ff; Ta5d6ff'
Ta5d6ff'Ta5d6ffspecify an ffmpeg raw format like format=Ta5d6ff"Ta5d6ffs16leTa5d6ff"Ta5d6ff instead Ta5d6ff'
Ta5d6ff'Ta5d6ffor call export(format=Ta5d6ff"Ta5d6ffrawTa5d6ff"Ta5d6ff) with no codec or parametersTa5d6ff'Tb4b4b4)

Te6edf3out_fTb4b4b4, Te6edf3_ Tff7b72= Te6edf3_fd_or_path_or_tempfileTb4b4b4(Te6edf3out_fTb4b4b4, Ta5d6ff'Ta5d6ffwb+Ta5d6ff'Tb4b4b4)
Te6edf3out_fTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)

Tff7b72if Tffa657format Tff7b72== Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4:
Te6edf3out_fTff7b72.Td2a8ffwriteTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4)
Te6edf3out_fTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72return Te6edf3out_f

T8b949e# wav with no ffmpeg parameters can just be written directly to out_f
Te6edf3easy_wav Tff7b72= Tffa657format Tff7b72== Ta5d6ff"Ta5d6ffwavTa5d6ff" Tff7b72and Te6edf3codec Tff7b72is Tff7b72None Tff7b72and Te6edf3parameters Tff7b72is Tff7b72None

Tff7b72if Te6edf3easy_wavTb4b4b4:
Te6edf3data Tff7b72= Te6edf3out_f
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4)

Te6edf3pcm_for_wav Tff7b72= Tff7b72selfTff7b72.Td2a8ff_data
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# convert to unsigned integers for wav
Te6edf3pcm_for_wav Tff7b72= Te6edf3audioopTff7b72.Td2a8ffbiasTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff128Tb4b4b4)

Te6edf3wave_data Tff7b72= Te6edf3waveTff7b72.Td2a8ffopenTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff'Ta5d6ffwbTa5d6ff'Tb4b4b4)
Te6edf3wave_dataTff7b72.Td2a8ffsetnchannelsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Te6edf3wave_dataTff7b72.Td2a8ffsetsampwidthTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)
Te6edf3wave_dataTff7b72.Td2a8ffsetframerateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4)
T8b949e# For some reason packing the wave header struct with
T8b949e# a float in python 2 doesn't throw an exception
Te6edf3wave_dataTff7b72.Td2a8ffsetnframesTb4b4b4(Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3wave_dataTff7b72.Td2a8ffwriteframesrawTb4b4b4(Te6edf3pcm_for_wavTb4b4b4)
Te6edf3wave_dataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

T8b949e# for easy wav files, we're done (wav data is written directly to out_f)
Tff7b72if Te6edf3easy_wavTb4b4b4:
Te6edf3out_fTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72return Te6edf3out_f

Te6edf3output Tff7b72= Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff"Ta5d6ffw+bTa5d6ff"Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4)

T8b949e# build converter command to export
Te6edf3conversion_command Tff7b72= Tb4b4b4[
Tff7b72selfTff7b72.Td2a8ffconverterTb4b4b4,
Ta5d6ff'Ta5d6ff-yTa5d6ff'Tb4b4b4, T8b949e# always overwrite existing files
Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwavTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Te6edf3dataTff7b72.Td2a8ffnameTb4b4b4, T8b949e# input options (filename last)
Tb4b4b4]

Tff7b72if Te6edf3codec Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3codec Tff7b72= Tff7b72selfTff7b72.Td2a8ffDEFAULT_CODECSTff7b72.Td2a8ffgetTb4b4b4(Tffa657formatTb4b4b4, Tff7b72NoneTb4b4b4)

Tff7b72if Te6edf3cover Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3coverTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Tb4b4b4(Ta5d6ff'Ta5d6ff.pngTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff.jpgTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff.jpegTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff.bmpTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff.tifTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff.tiffTa5d6ff'Tb4b4b4)Tb4b4b4) Tff7b72and Tffa657format Tff7b72== Ta5d6ff"Ta5d6ffmp3Ta5d6ff"Tb4b4b4:
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Te6edf3coverTb4b4b4, Ta5d6ff"Ta5d6ff-mapTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-mapTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-c:vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmjpegTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149AttributeErrorTb4b4b4(
Ta5d6ff"Ta5d6ffCurrently cover images are only supported by MP3 files. The allowed image formats are: .tif, .jpg, .bmp, .jpeg and .png.Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3codec Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
T8b949e# force audio encoder
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff-acodecTa5d6ff"Tb4b4b4, Te6edf3codecTb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3bitrate Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff-b:aTa5d6ff"Tb4b4b4, Te6edf3bitrateTb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3parameters Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
T8b949e# extend arguments with arbitrary set
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Te6edf3parametersTb4b4b4)

Tff7b72if Te6edf3tags Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3tagsTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3InvalidTagTb4b4b4(Ta5d6ff"Ta5d6ffTags must be a dictionary.Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Extend converter command with tags
T8b949e# print(tags)
Tff7b72for Te6edf3keyTb4b4b4, Te6edf3value Tff7b72in Te6edf3tagsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(
Tb4b4b4[Ta5d6ff'Ta5d6ff-metadataTa5d6ff'Tb4b4b4, Ta5d6ff'Tffd700{0}Ta5d6ff=Tffd700{1}Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4]Tb4b4b4)

Tff7b72if Tffa657format Tff7b72== Ta5d6ff'Ta5d6ffmp3Ta5d6ff'Tb4b4b4:
T8b949e# set id3v2 tag version
Tff7b72if Te6edf3id3v2_version Tff7b72not Tff7b72in Te6edf3id3v2_allowed_versionsTb4b4b4:
Tff7b72raise Te6edf3InvalidID3TagVersionTb4b4b4(
Ta5d6ff"Ta5d6ffid3v2_version not allowed, allowed versions: Tffd700%sTa5d6ff" Tff7b72% Te6edf3id3v2_allowed_versionsTb4b4b4)
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[
Ta5d6ff"Ta5d6ff-id3v2_versionTa5d6ff"Tb4b4b4, Te6edf3id3v2_version
Tb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff'Ta5d6ffdarwinTa5d6ff' Tff7b72and Te6edf3codec Tff7b72== Ta5d6ff'Ta5d6ffmp3Ta5d6ff'Tb4b4b4:
Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff-write_xingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3conversion_commandTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[
Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Tffa657formatTb4b4b4, Te6edf3outputTff7b72.Td2a8ffnameTb4b4b4, T8b949e# output options (filename last)
Tb4b4b4]Tb4b4b4)

Te6edf3log_conversionTb4b4b4(Te6edf3conversion_commandTb4b4b4)

T8b949e# read stdin / write stdout
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffdevnullTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3devnullTb4b4b4:
Te6edf3p Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(Te6edf3conversion_commandTb4b4b4, Te6edf3stdinTff7b72=Te6edf3devnullTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3p_outTb4b4b4, Te6edf3p_err Tff7b72= Te6edf3pTff7b72.Td2a8ffcommunicateTb4b4b4(Tb4b4b4)

Te6edf3log_subprocess_outputTb4b4b4(Te6edf3p_outTb4b4b4)
Te6edf3log_subprocess_outputTb4b4b4(Te6edf3p_errTb4b4b4)

Tff7b72if Te6edf3pTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3CouldntEncodeErrorTb4b4b4(
Ta5d6ff"Ta5d6ffEncoding failed. ffmpeg/avlib returned error code: Tffd700{0}Tffea00\nTffea00\nTa5d6ffCommand:Tffd700{1}Tffea00\nTffea00\nTa5d6ffOutput from ffmpeg/avlib:Tffea00\nTffea00\nTffd700{2}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3pTff7b72.Td2a8ffreturncodeTb4b4b4, Te6edf3conversion_commandTb4b4b4, Te6edf3p_errTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4) Tb4b4b4)Tb4b4b4)

Te6edf3outputTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3out_fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3outputTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3dataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3dataTff7b72.Td2a8ffnameTb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3outputTff7b72.Td2a8ffnameTb4b4b4)

Te6edf3out_fTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72return Te6edf3out_f

Tff7b72def Td2a8ffget_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3indexTb4b4b4)Tb4b4b4:
Te6edf3frame_start Tff7b72= Te6edf3index Tff7b72* Tff7b72selfTff7b72.Td2a8ffframe_width
Te6edf3frame_end Tff7b72= Te6edf3frame_start Tff7b72+ Tff7b72selfTff7b72.Td2a8ffframe_width
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4[Te6edf3frame_startTb4b4b4:Te6edf3frame_endTb4b4b4]

Tff7b72def Td2a8ffframe_countTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
returns the number of frames for the given number of milliseconds, or
if not specified, the number of frames in the whole AudioSegment
"""
Tff7b72if Te6edf3ms Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3ms Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_rate Tff7b72/ T79c0ff1000.0Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tffa657floatTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4) Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffframe_widthTb4b4b4)

Tff7b72def Td2a8ffset_sample_widthTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sample_widthTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3sample_width Tff7b72== Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4:
Tff7b72return Tff7b72self

Te6edf3frame_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72* Te6edf3sample_width

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(
Te6edf3audioopTff7b72.Td2a8fflin2linTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Te6edf3sample_widthTb4b4b4)Tb4b4b4,
Te6edf3overridesTff7b72=Tb4b4b4{Ta5d6ff'Ta5d6ffsample_widthTa5d6ff'Tb4b4b4: Te6edf3sample_widthTb4b4b4, Ta5d6ff'Ta5d6ffframe_widthTa5d6ff'Tb4b4b4: Te6edf3frame_widthTb4b4b4}
Tb4b4b4)

Tff7b72def Td2a8ffset_frame_rateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frame_rateTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3frame_rate Tff7b72== Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4:
Tff7b72return Tff7b72self

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4:
Te6edf3convertedTb4b4b4, Te6edf3_ Tff7b72= Te6edf3audioopTff7b72.Td2a8ffratecvTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffframe_rateTb4b4b4,
Te6edf3frame_rateTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3converted Tff7b72= Tff7b72selfTff7b72.Td2a8ff_data

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3convertedTb4b4b4,
Te6edf3overridesTff7b72=Tb4b4b4{Ta5d6ff'Ta5d6ffframe_rateTa5d6ff'Tb4b4b4: Te6edf3frame_rateTb4b4b4}Tb4b4b4)

Tff7b72def Td2a8ffset_channelsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3channelsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3channels Tff7b72== Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4:
Tff7b72return Tff7b72self

Tff7b72if Te6edf3channels Tff7b72== T79c0ff2 Tff7b72and Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3fn Tff7b72= Te6edf3audioopTff7b72.Td2a8fftostereo
Te6edf3frame_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72* T79c0ff2
Te6edf3fac Tff7b72= T79c0ff1
Te6edf3converted Tff7b72= Te6edf3fnTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Te6edf3facTb4b4b4, Te6edf3facTb4b4b4)
Tff7b72elif Te6edf3channels Tff7b72== T79c0ff1 Tff7b72and Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3fn Tff7b72= Te6edf3audioopTff7b72.Td2a8fftomono
Te6edf3frame_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72/Tff7b72/ T79c0ff2
Te6edf3fac Tff7b72= T79c0ff0.5
Te6edf3converted Tff7b72= Te6edf3fnTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Te6edf3facTb4b4b4, Te6edf3facTb4b4b4)
Tff7b72elif Te6edf3channels Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3channels_data Tff7b72= Tb4b4b4[Te6edf3segTff7b72.Td2a8ffget_array_of_samplesTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3seg Tff7b72in Tff7b72selfTff7b72.Td2a8ffsplit_to_monoTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3frame_count Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3converted Tff7b72= Te6edf3arrayTff7b72.Td2a8ffarrayTb4b4b4(
Te6edf3channels_dataTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8fftypecodeTb4b4b4,
Ta5d6ffbTa5d6ff'Tffea00\0Ta5d6ff' Tff7b72* Tb4b4b4(Te6edf3frame_count Tff7b72* Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)
Tb4b4b4)
Tff7b72for Te6edf3raw_channel_data Tff7b72in Te6edf3channels_dataTb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3frame_countTb4b4b4)Tb4b4b4:
Te6edf3convertedTb4b4b4[Te6edf3iTb4b4b4] Tff7b72+Tff7b72= Te6edf3raw_channel_dataTb4b4b4[Te6edf3iTb4b4b4] Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffchannels
Te6edf3frame_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_width Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3dup_channels Tff7b72= Tb4b4b4[Tff7b72self Tff7b72for Te6edf3iChannel Tff7b72in Tffa657rangeTb4b4b4(Te6edf3channelsTb4b4b4)Tb4b4b4]
Tff7b72return Te6edf3AudioSegmentTff7b72.Td2a8fffrom_mono_audiosegmentsTb4b4b4(Tff7b72*Te6edf3dup_channelsTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffAudioSegment.set_channels only supports mono-to-multi channel and multi-to-mono channel conversionTa5d6ff"Tb4b4b4)

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3convertedTb4b4b4,
Te6edf3overridesTff7b72=Tb4b4b4{
Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4: Te6edf3channelsTb4b4b4,
Ta5d6ff'Ta5d6ffframe_widthTa5d6ff'Tb4b4b4: Te6edf3frame_widthTb4b4b4}Tb4b4b4)

Tff7b72def Td2a8ffsplit_to_monoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Tb4b4b4[Tff7b72selfTb4b4b4]

Te6edf3samples Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_array_of_samplesTb4b4b4(Tb4b4b4)

Te6edf3mono_channels Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4:
Te6edf3samples_for_current_channel Tff7b72= Te6edf3samplesTb4b4b4[Te6edf3iTb4b4b4:Tb4b4b4:Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]

Tff7b72tryTb4b4b4:
Te6edf3mono_data Tff7b72= Te6edf3samples_for_current_channelTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Te6edf3mono_data Tff7b72= Te6edf3samples_for_current_channelTff7b72.Td2a8fftostringTb4b4b4(Tb4b4b4)

Te6edf3mono_channelsTff7b72.Td2a8ffappendTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3mono_dataTb4b4b4, Te6edf3overridesTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffframe_widthTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4}Tb4b4b4)
Tb4b4b4)

Tff7b72return Te6edf3mono_channels

Tf0883e@property
Tff7b72def Td2a8ffrmsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3audioopTff7b72.Td2a8ffrmsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffdBFSTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3rms Tff7b72= Tff7b72selfTff7b72.Td2a8ffrms
Tff7b72if Tff7b72not Te6edf3rmsTb4b4b4:
Tff7b72return Tff7b72-Tffa657floatTb4b4b4(Ta5d6ff"Ta5d6ffinfinityTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3ratio_to_dbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrms Tff7b72/ Tff7b72selfTff7b72.Td2a8ffmax_possible_amplitudeTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffmaxTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3audioopTff7b72.Td2a8ffmaxTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffmax_possible_amplitudeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3bits Tff7b72= Tff7b72selfTff7b72.Td2a8ffsample_width Tff7b72* T79c0ff8
Te6edf3max_possible_val Tff7b72= Tb4b4b4(T79c0ff2 Tff7b72*Tff7b72* Te6edf3bitsTb4b4b4)

T8b949e# since half is above 0 and half is below the max amplitude is divided
Tff7b72return Te6edf3max_possible_val Tff7b72/ T79c0ff2

Tf0883e@property
Tff7b72def Td2a8ffmax_dBFSTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ratio_to_dbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmaxTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmax_possible_amplitudeTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffduration_secondsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffframe_rate Tff7b72and Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Tb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffframe_rate Tff7b72or T79c0ff0.0

Tff7b72def Td2a8ffget_dc_offsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3channelTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns a value between -1.0 and 1.0 representing the DC offset of a
channel (1 for left, 2 for right).
"""
Tff7b72if Tff7b72not T79c0ff1 Tff7b72<Tff7b72= Te6edf3channel Tff7b72<Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffchannel value must be 1 (left) or 2 (right)Ta5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_data
Tff7b72elif Te6edf3channel Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3audioopTff7b72.Td2a8fftomonoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Te6edf3audioopTff7b72.Td2a8fftomonoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff1Tb4b4b4)

Tff7b72return Tffa657floatTb4b4b4(Te6edf3audioopTff7b72.Td2a8ffavgTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)Tb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffmax_possible_amplitude

Tff7b72def Td2a8ffremove_dc_offsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3channelTff7b72=Tff7b72NoneTb4b4b4, Te6edf3offsetTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Removes DC offset of given channel. Calculates offset if it's not given.
Offset values must be in range -1.0 to 1.0. If channel is None, removes
DC offset from all available channels.
"""
Tff7b72if Te6edf3channel Tff7b72and Tff7b72not T79c0ff1 Tff7b72<Tff7b72= Te6edf3channel Tff7b72<Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffchannel value must be None, 1 (left) or 2 (right)Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3offset Tff7b72and Tff7b72not Tff7b72-T79c0ff1.0 Tff7b72<Tff7b72= Te6edf3offset Tff7b72<Tff7b72= T79c0ff1.0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffoffset value must be in range -1.0 to 1.0Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3offsetTb4b4b4:
Te6edf3offset Tff7b72= Tffa657intTb4b4b4(Tffa657roundTb4b4b4(Te6edf3offset Tff7b72* Tff7b72selfTff7b72.Td2a8ffmax_possible_amplitudeTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffremove_data_dcTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3offTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3offTb4b4b4:
Te6edf3off Tff7b72= Te6edf3audioopTff7b72.Td2a8ffavgTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)
Tff7b72return Te6edf3audioopTff7b72.Td2a8ffbiasTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Tff7b72-Te6edf3offTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3remove_data_dcTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Te6edf3offsetTb4b4b4)Tb4b4b4)

Te6edf3left_channel Tff7b72= Te6edf3audioopTff7b72.Td2a8fftomonoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3right_channel Tff7b72= Te6edf3audioopTff7b72.Td2a8fftomonoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff1Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3channel Tff7b72or Te6edf3channel Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3left_channel Tff7b72= Te6edf3remove_data_dcTb4b4b4(Te6edf3left_channelTb4b4b4, Te6edf3offsetTb4b4b4)

Tff7b72if Tff7b72not Te6edf3channel Tff7b72or Te6edf3channel Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3right_channel Tff7b72= Te6edf3remove_data_dcTb4b4b4(Te6edf3right_channelTb4b4b4, Te6edf3offsetTb4b4b4)

Te6edf3left_channel Tff7b72= Te6edf3audioopTff7b72.Td2a8fftostereoTb4b4b4(Te6edf3left_channelTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3right_channel Tff7b72= Te6edf3audioopTff7b72.Td2a8fftostereoTb4b4b4(Te6edf3right_channelTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff1Tb4b4b4)

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3audioopTff7b72.Td2a8ffaddTb4b4b4(Te6edf3left_channelTb4b4b4, Te6edf3right_channelTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffapply_gainTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3volume_changeTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3db_to_floatTb4b4b4(Tffa657floatTb4b4b4(Te6edf3volume_changeTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffoverlayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segTb4b4b4, Te6edf3positionTff7b72=T79c0ff0Tb4b4b4, Te6edf3loopTff7b72=Tff7b72FalseTb4b4b4, Te6edf3timesTff7b72=Tff7b72NoneTb4b4b4, Te6edf3gain_during_overlayTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Overlay the provided segment on to this segment starting at the
specificed position and using the specfied looping beahvior.

seg (AudioSegment):
The audio segment to overlay on to this one.

position (optional int):
The position to start overlaying the provided segment in to this
one.

loop (optional bool):
Loop seg as many times as necessary to match this segment's length.
Overrides loops param.

times (optional int):
Loop seg the specified number of times or until it matches this
segment's length. 1 means once, 2 means twice, ... 0 would make the
call a no-op
gain_during_overlay (optional int):
Changes this segment's volume by the specified amount during the
duration of time that seg is overlaid on top of it. When negative,
this has the effect of 'ducking' the audio under the overlay.
"""

Tff7b72if Te6edf3loopTb4b4b4:
T8b949e# match loop=True's behavior with new times (count) mechinism.
Te6edf3times Tff7b72= Tff7b72-T79c0ff1
Tff7b72elif Te6edf3times Tff7b72is Tff7b72NoneTb4b4b4:
T8b949e# no times specified, just once through
Te6edf3times Tff7b72= T79c0ff1
Tff7b72elif Te6edf3times Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# it's a no-op, make a copy since we never mutate
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4)

Te6edf3output Tff7b72= Te6edf3StringIOTb4b4b4(Tb4b4b4)

Te6edf3seg1Tb4b4b4, Te6edf3seg2 Tff7b72= Te6edf3AudioSegmentTff7b72.Td2a8ff_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segTb4b4b4)
Te6edf3sample_width Tff7b72= Te6edf3seg1Tff7b72.Td2a8ffsample_width
Te6edf3spawn Tff7b72= Te6edf3seg1Tff7b72.Td2a8ff_spawn

Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3seg1Tb4b4b4[Tb4b4b4:Te6edf3positionTb4b4b4]Tff7b72.Td2a8ff_dataTb4b4b4)

T8b949e# drop down to the raw data
Te6edf3seg1 Tff7b72= Te6edf3seg1Tb4b4b4[Te6edf3positionTb4b4b4:Tb4b4b4]Tff7b72.Td2a8ff_data
Te6edf3seg2 Tff7b72= Te6edf3seg2Tff7b72.Td2a8ff_data
Te6edf3pos Tff7b72= T79c0ff0
Te6edf3seg1_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3seg1Tb4b4b4)
Te6edf3seg2_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3seg2Tb4b4b4)
Tff7b72while Te6edf3timesTb4b4b4:
Te6edf3remaining Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3seg1_len Tff7b72- Te6edf3posTb4b4b4)
Tff7b72if Te6edf3seg2_len Tff7b72>Tff7b72= Te6edf3remainingTb4b4b4:
Te6edf3seg2 Tff7b72= Te6edf3seg2Tb4b4b4[Tb4b4b4:Te6edf3remainingTb4b4b4]
Te6edf3seg2_len Tff7b72= Te6edf3remaining
T8b949e# we've hit the end, we're done looping (if we were) and this
T8b949e# is our last go-around
Te6edf3times Tff7b72= T79c0ff1

Tff7b72if Te6edf3gain_during_overlayTb4b4b4:
Te6edf3seg1_overlaid Tff7b72= Te6edf3seg1Tb4b4b4[Te6edf3posTb4b4b4:Te6edf3pos Tff7b72+ Te6edf3seg2_lenTb4b4b4]
Te6edf3seg1_adjusted_gain Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3seg1_overlaidTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3db_to_floatTb4b4b4(Tffa657floatTb4b4b4(Te6edf3gain_during_overlayTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3audioopTff7b72.Td2a8ffaddTb4b4b4(Te6edf3seg1_adjusted_gainTb4b4b4, Te6edf3seg2Tb4b4b4, Te6edf3sample_widthTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3audioopTff7b72.Td2a8ffaddTb4b4b4(Te6edf3seg1Tb4b4b4[Te6edf3posTb4b4b4:Te6edf3pos Tff7b72+ Te6edf3seg2_lenTb4b4b4]Tb4b4b4, Te6edf3seg2Tb4b4b4,
Te6edf3sample_widthTb4b4b4)Tb4b4b4)
Te6edf3pos Tff7b72+Tff7b72= Te6edf3seg2_len

T8b949e# dec times to break our while loop (eventually)
Te6edf3times Tff7b72-Tff7b72= T79c0ff1

Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3seg1Tb4b4b4[Te6edf3posTb4b4b4:Tb4b4b4]Tb4b4b4)

Tff7b72return Te6edf3spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3outputTb4b4b4)

Tff7b72def Td2a8ffappendTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segTb4b4b4, Te6edf3crossfadeTff7b72=T79c0ff100Tb4b4b4)Tb4b4b4:
Te6edf3seg1Tb4b4b4, Te6edf3seg2 Tff7b72= Te6edf3AudioSegmentTff7b72.Td2a8ff_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segTb4b4b4)

Tff7b72if Tff7b72not Te6edf3crossfadeTb4b4b4:
Tff7b72return Te6edf3seg1Tff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3seg1Tff7b72.Td2a8ff_data Tff7b72+ Te6edf3seg2Tff7b72.Td2a8ff_dataTb4b4b4)
Tff7b72elif Te6edf3crossfade Tff7b72> Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCrossfade is longer than the original AudioSegment (Tffd700{}Ta5d6ffms > Tffd700{}Ta5d6ffms)Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3crossfadeTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)
Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3crossfade Tff7b72> Tffa657lenTb4b4b4(Te6edf3segTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCrossfade is longer than the appended AudioSegment (Tffd700{}Ta5d6ffms > Tffd700{}Ta5d6ffms)Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3crossfadeTb4b4b4, Tffa657lenTb4b4b4(Te6edf3segTb4b4b4)
Tb4b4b4)Tb4b4b4)

Te6edf3xf Tff7b72= Te6edf3seg1Tb4b4b4[Tff7b72-Te6edf3crossfadeTb4b4b4:Tb4b4b4]Tff7b72.Td2a8fffadeTb4b4b4(Te6edf3to_gainTff7b72=Tff7b72-T79c0ff120Tb4b4b4, Te6edf3startTff7b72=T79c0ff0Tb4b4b4, Te6edf3endTff7b72=Tffa657floatTb4b4b4(Ta5d6ff'Ta5d6ffinfTa5d6ff'Tb4b4b4)Tb4b4b4)
Te6edf3xf Tff7b72*Tff7b72= Te6edf3seg2Tb4b4b4[Tb4b4b4:Te6edf3crossfadeTb4b4b4]Tff7b72.Td2a8fffadeTb4b4b4(Te6edf3from_gainTff7b72=Tff7b72-T79c0ff120Tb4b4b4, Te6edf3startTff7b72=T79c0ff0Tb4b4b4, Te6edf3endTff7b72=Tffa657floatTb4b4b4(Ta5d6ff'Ta5d6ffinfTa5d6ff'Tb4b4b4)Tb4b4b4)

Te6edf3output Tff7b72= Te6edf3TemporaryFileTb4b4b4(Tb4b4b4)

Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3seg1Tb4b4b4[Tb4b4b4:Tff7b72-Te6edf3crossfadeTb4b4b4]Tff7b72.Td2a8ff_dataTb4b4b4)
Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3xfTff7b72.Td2a8ff_dataTb4b4b4)
Te6edf3outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3seg2Tb4b4b4[Te6edf3crossfadeTb4b4b4:Tb4b4b4]Tff7b72.Td2a8ff_dataTb4b4b4)

Te6edf3outputTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3obj Tff7b72= Te6edf3seg1Tff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3outputTb4b4b4)
Te6edf3outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3obj

Tff7b72def Td2a8fffadeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3to_gainTff7b72=T79c0ff0Tb4b4b4, Te6edf3from_gainTff7b72=T79c0ff0Tb4b4b4, Te6edf3startTff7b72=Tff7b72NoneTb4b4b4, Te6edf3endTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3durationTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Fade the volume of this audio segment.

to_gain (float):
resulting volume_change in db

start (int):
default = beginning of the segment
when in this segment to start fading in milliseconds

end (int):
default = end of the segment
when in this segment to start fading in milliseconds

duration (int):
default = until the end of the audio segment
the duration of the fade
"""
Tff7b72if Tff7b72None Tff7b72not Tff7b72in Tb4b4b4[Te6edf3durationTb4b4b4, Te6edf3endTb4b4b4, Te6edf3startTb4b4b4]Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff'Ta5d6ffOnly two of the three arguments, Ta5d6ff"Ta5d6ffstartTa5d6ff"Ta5d6ff, Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffendTa5d6ff"Ta5d6ff, and Ta5d6ff"Ta5d6ffdurationTa5d6ff"Ta5d6ff may be specifiedTa5d6ff'Tb4b4b4)

T8b949e# no fade == the same audio
Tff7b72if Te6edf3to_gain Tff7b72== T79c0ff0 Tff7b72and Te6edf3from_gain Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72self

Te6edf3start Tff7b72= Tffa657minTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3startTb4b4b4) Tff7b72if Te6edf3start Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None
Te6edf3end Tff7b72= Tffa657minTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3endTb4b4b4) Tff7b72if Te6edf3end Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None

Tff7b72if Te6edf3start Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3start Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3start Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3end Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3end Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3end Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72if Te6edf3duration Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3duration Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3InvalidDurationTb4b4b4(Ta5d6ff"Ta5d6ffduration must be a positive integerTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3durationTb4b4b4:
Tff7b72if Te6edf3start Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3end Tff7b72= Te6edf3start Tff7b72+ Te6edf3duration
Tff7b72elif Te6edf3end Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3start Tff7b72= Te6edf3end Tff7b72- Te6edf3duration
Tff7b72elseTb4b4b4:
Te6edf3duration Tff7b72= Te6edf3end Tff7b72- Te6edf3start

Te6edf3from_power Tff7b72= Te6edf3db_to_floatTb4b4b4(Te6edf3from_gainTb4b4b4)

Te6edf3output Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# original data - up until the crossfade portion, as is
Te6edf3before_fade Tff7b72= Tff7b72selfTb4b4b4[Tb4b4b4:Te6edf3startTb4b4b4]Tff7b72.Td2a8ff_data
Tff7b72if Te6edf3from_gain Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3before_fade Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3before_fadeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3from_powerTb4b4b4)
Te6edf3outputTff7b72.Td2a8ffappendTb4b4b4(Te6edf3before_fadeTb4b4b4)

Te6edf3gain_delta Tff7b72= Te6edf3db_to_floatTb4b4b4(Te6edf3to_gainTb4b4b4) Tff7b72- Te6edf3from_power

T8b949e# fades longer than 100ms can use coarse fading (one gain step per ms),
T8b949e# shorter fades will have audible clicks so they use precise fading
T8b949e# (one gain step per sample)
Tff7b72if Te6edf3duration Tff7b72> T79c0ff100Tb4b4b4:
Te6edf3scale_step Tff7b72= Te6edf3gain_delta Tff7b72/ Te6edf3duration

Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3durationTb4b4b4)Tb4b4b4:
Te6edf3volume_change Tff7b72= Te6edf3from_power Tff7b72+ Tb4b4b4(Te6edf3scale_step Tff7b72* Te6edf3iTb4b4b4)
Te6edf3chunk Tff7b72= Tff7b72selfTb4b4b4[Te6edf3start Tff7b72+ Te6edf3iTb4b4b4]
Te6edf3chunk Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3chunkTff7b72.Td2a8ff_dataTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3volume_changeTb4b4b4)

Te6edf3outputTff7b72.Td2a8ffappendTb4b4b4(Te6edf3chunkTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3start_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Te6edf3msTff7b72=Te6edf3startTb4b4b4)
Te6edf3end_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_countTb4b4b4(Te6edf3msTff7b72=Te6edf3endTb4b4b4)
Te6edf3fade_frames Tff7b72= Te6edf3end_frame Tff7b72- Te6edf3start_frame
Te6edf3scale_step Tff7b72= Te6edf3gain_delta Tff7b72/ Te6edf3fade_frames

Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tffa657intTb4b4b4(Te6edf3fade_framesTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3volume_change Tff7b72= Te6edf3from_power Tff7b72+ Tb4b4b4(Te6edf3scale_step Tff7b72* Te6edf3iTb4b4b4)
Te6edf3sample Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_frameTb4b4b4(Tffa657intTb4b4b4(Te6edf3start_frame Tff7b72+ Te6edf3iTb4b4b4)Tb4b4b4)
Te6edf3sample Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3sampleTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4, Te6edf3volume_changeTb4b4b4)

Te6edf3outputTff7b72.Td2a8ffappendTb4b4b4(Te6edf3sampleTb4b4b4)

T8b949e# original data after the crossfade portion, at the new volume
Te6edf3after_fade Tff7b72= Tff7b72selfTb4b4b4[Te6edf3endTb4b4b4:Tb4b4b4]Tff7b72.Td2a8ff_data
Tff7b72if Te6edf3to_gain Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3after_fade Tff7b72= Te6edf3audioopTff7b72.Td2a8ffmulTb4b4b4(Te6edf3after_fadeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3db_to_floatTb4b4b4(Te6edf3to_gainTb4b4b4)Tb4b4b4)
Te6edf3outputTff7b72.Td2a8ffappendTb4b4b4(Te6edf3after_fadeTb4b4b4)

Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(Te6edf3dataTff7b72=Te6edf3outputTb4b4b4)

Tff7b72def Td2a8fffade_outTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3durationTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffadeTb4b4b4(Te6edf3to_gainTff7b72=Tff7b72-T79c0ff120Tb4b4b4, Te6edf3durationTff7b72=Te6edf3durationTb4b4b4, Te6edf3endTff7b72=Tffa657floatTb4b4b4(Ta5d6ff'Ta5d6ffinfTa5d6ff'Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fffade_inTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3durationTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffadeTb4b4b4(Te6edf3from_gainTff7b72=Tff7b72-T79c0ff120Tb4b4b4, Te6edf3durationTff7b72=Te6edf3durationTb4b4b4, Te6edf3startTff7b72=T79c0ff0Tb4b4b4)

Tff7b72def Td2a8ffreverseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_spawnTb4b4b4(
Te6edf3dataTff7b72=Te6edf3audioopTff7b72.Td2a8ffreverseTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsample_widthTb4b4b4)
Tb4b4b4)

Tff7b72def Td2a8ff_repr_html_Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3src Tff7b72= Ta5d6ff"""
Ta5d6ff <audio controls>
Ta5d6ff <source src=Ta5d6ff"Ta5d6ffdata:audio/mpeg;base64,Tffd700{base64}Ta5d6ff"Ta5d6ff type=Ta5d6ff"Ta5d6ffaudio/mpegTa5d6ff"Ta5d6ff/>
Ta5d6ff Your browser does not support the audio element.
Ta5d6ff </audio>
Ta5d6ff Ta5d6ff"""
Te6edf3fh Tff7b72= Tff7b72selfTff7b72.Td2a8ffexportTb4b4b4(Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffasciiTa5d6ff'Tb4b4b4)
Tff7b72return Te6edf3srcTff7b72.Td2a8ffformatTb4b4b4(Te6edf3base64Tff7b72=Te6edf3dataTb4b4b4)


Tff7b72from T7ee787. Tff7b72import Te6edf3effects


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────